package project2.ui;

import project2.config.Config;
import project2.resources.Images;
import project2.resources.Scores;
import project2.ui.game.GameLoadingPanel;
import project2.ui.game.GamePlayingPanel;
import project2.ui.manage.HelpDialog;
import project2.ui.manage.PopupMenuPanel;
import project2.ui.manage.Top10ScorePanel;
import project2.ui.manage.operate.ExitGame;

import javax.swing.*;
import java.awt.*;

public class MainFrame extends JFrame {
    private static final long serialVersionUID = 1L;

    // 组件
    public GameLoadingPanel gameLoadingPanel;// 加载面板
    public GamePlayingPanel gamePlayingPanel;// 游戏面板
    public PopupMenuPanel popupMenuPanel;// 菜单面板
    public Top10ScorePanel popupScorePanel;// 分数面板
    public HelpDialog helpDialog;// 帮助窗口
    // 人工操作
    public final ExitGame exitGameAction = new ExitGame();// 退出游戏

    public MainFrame() {
        this.initComponents();// JFrame初始化
        this.initBackgroundImage();// 背景初始化
    }

    /**
     * JFrame初始化
     */
    private void initComponents() {
        this.setTitle("战机游戏");// 标题
        this.setIconImage(new ImageIcon(Config.LOGO_IMG).getImage());// 图标
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();// 屏幕大小
        int x = (d.width - Config.MAIN_FRAME_WIDTH) / 2;
        int y = (d.height - Config.MAIN_FRAME_HEIGHT) / 2;
        y = Math.max(y, 0);
        this.setBounds(x, y, Config.MAIN_FRAME_WIDTH, Config.MAIN_FRAME_HEIGHT);// 位置和大小
        this.setResizable(false);// 不可变大小
        this.setVisible(true);// 显示
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 点击关闭的效果
        this.addKeyListener(exitGameAction);
    }

    /**
     * 背景初始化
     */
    private void initBackgroundImage() {
        ImageIcon bgImgIcon = new ImageIcon(Images.SHOOT_BACKGROUND_IMG);// 图片
        JLabel bgLabel = new JLabel(bgImgIcon);// 作为Label
        bgLabel.setBounds(0, 0, bgImgIcon.getIconWidth(), bgImgIcon.getIconHeight());// 设置位置和大小
        this.getLayeredPane().add(bgLabel, Integer.valueOf(Integer.MIN_VALUE));// 放在最底层
        ((JPanel) this.getContentPane()).setOpaque(false);// 内容层设置透明
    }

    /**
     * 开始游戏
     */
    public void loadGame() throws Exception {
        this.startLoad();// 开启引导面板
        this.startGame();// 开启游戏面板
    }

    /**
     * 开启引导面板
     */
    private void startLoad() {
        // 画布上有内容则清理掉
        Container c = this.getContentPane();
        c.removeAll();
        this.repaint();
        // 创建加载面板
        if (this.gameLoadingPanel == null) {
            this.gameLoadingPanel = new GameLoadingPanel();
        }
        // 画布上放入面板
        c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));// 箱式布局，网格布局的简化，纵向布局
        c.add(Box.createVerticalGlue());// 撑满空间
        c.add(this.gameLoadingPanel);// 放入加载面板
        c.add(Box.createVerticalGlue());// 撑满空间
        this.gameLoadingPanel.loadingGame();// 加载面板运行动画
    }

    /**
     * 开启游戏面板
     */
    private void startGame() throws Exception {
        // 画布上有内容则清理掉
        Container c = this.getContentPane();
        c.removeAll();
        this.repaint();
        // 画布上放入面板
        c.setLayout(new BorderLayout());// 边界布局
        this.gamePlayingPanel = new GamePlayingPanel();// 创建游戏面板
        c.add(this.gamePlayingPanel, BorderLayout.CENTER);// 放入游戏面板
        this.gamePlayingPanel.startGame();// 游戏面板运行（注意这里是异步执行的）
        // 等待游戏面板结束（主角飞机死亡）
        long startTime = System.currentTimeMillis();
        while (this.gamePlayingPanel.myPlane.isAlive()) {
            try {
                Thread.sleep(Config.GAME_PANEL_REPAINT_INTERVAL);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        // 记录分数
        Scores.addScore(this.gamePlayingPanel.score.get(), endTime - startTime);
        // 友好提示
        String message = "游戏结束，分数：" + this.gamePlayingPanel.score + "，再来一局么？";
        int option = JOptionPane.showConfirmDialog(this, message, "游戏结束", JOptionPane.YES_NO_OPTION);
        switch (option) {
            case JOptionPane.YES_OPTION:
                loadGame();// 再来一次
                break;
            case JOptionPane.NO_OPTION:
                popupMenuPanel();// 打开菜单
                break;
        }
    }

    /**
     * 打开菜单
     */
    public void popupMenuPanel() {
        // 画布上有内容则清理掉
        Container c = this.getContentPane();
        c.removeAll();
        this.repaint();
        // 创建菜单面板
        if (this.popupMenuPanel == null) {
            this.popupMenuPanel = new PopupMenuPanel(this);
        }
        // 画布上放入面板
        c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));
        c.add(Box.createVerticalGlue());
        c.add(this.popupMenuPanel);
        c.add(Box.createVerticalGlue());
        this.validate();// 重新调整大小，前提是已经设置大小（已经调用了setSize()），且大小发生变化。
    }
}
